/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucuenca.paginaasos.uimanager;

import edu.ucuenca.paginaasos.controller.GenericController;
import edu.ucuenca.paginaasos.entity.Categoria;
import edu.ucuenca.paginaasos.entity.Comentario;
import edu.ucuenca.paginaasos.entity.Escuela;
import edu.ucuenca.paginaasos.entity.Foro;
import edu.ucuenca.paginaasos.entity.Galeria;
import edu.ucuenca.paginaasos.entity.Libro;
import edu.ucuenca.paginaasos.entity.Publicidad;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author CHRISTIAN
 */
@ManagedBean(name = "gestorPrincipal")
@SessionScoped
public class GestorPrincipal implements Serializable {

    private String actualURL;
    private Escuela escuela;
    private List<Publicidad> publicidades;
    private List<Galeria> galerias;
    private List<Foro> noticias;
    private List<Foro> noticiasCorto;
    private List<Foro> foros;
    private List<Foro> eventos;
    private List<Comentario> comentarios;
    private List<Libro> listaLibros;
    private Foro foroseleccionado;
    private Comentario selectedComentario;
    private String subdominio = "asosistemas";
    private String cabeceraArticulo;
    private Boolean mostrarComentarioNuevo;
    private Boolean sinLoggin;
    private String textoComentario;
    private List<Categoria> categorias;
    private Categoria selectedCategoria;
    private String nombreCategoria;
    private Integer delayMessage = 6000;

    private String mensaje;

    private final GenericController<Escuela> escuelaController = new GenericController<Escuela>();
    private List<Escuela> escuelas = new ArrayList<Escuela>();

    public static GestorPrincipal getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{gestorPrincipal}", GestorPrincipal.class);
        return (GestorPrincipal) ex.getValue(context);
    }
    
  
    
    

    @PostConstruct
    public void init() {
        escuelas= escuelaController.findWhere(new Escuela(), "id>0 order by nombre");
        if (escuelas == null) {
            escuelas = new ArrayList<Escuela>();
        }
    }

    public String obtenerLibrosCategoria(){  
        if (selectedCategoria!=null && selectedCategoria.getId()!=null){
            obtenerLibros(selectedCategoria);
            return "contenidoCategoria";
        }        
        return "";
    } 
    
    public boolean hayEscuela() {
        return escuela != null && escuela.getId() != null && escuela.getNombre() != null && !escuela.getNombre().isEmpty();
    }

    private String txt2html(String txt) {
        return txt.replace("\n", "<br/>");
    }

    public String obtenerMisionHtml() {
        if (escuela != null) {
            if (escuela.getMision() != null) {
                return escuela.getMision();
            }
        }
        return "";
    }

    public String obtenerPlanTrabajo() {
        if (escuela != null && escuela.getPlanTrabajo() != null) {
            return escuela.getPlanTrabajo();
        }
        return "";
    }

    public String obtenerVisionHtml() {
          if (escuela != null) {
         if (escuela.getVision() != null) {
         return escuela.getVision();
         }
         }
        return "";
    }

    public String paginaPlanTrabajoRedir() {
        return "plantrabajo?faces-redirect=true";
    }

    public String paginaAgendaRedir() {
        return "agenda?faces-redirect=true";
    }

    public String paginaVisionMisionRedir() {
        GestorEscuela.getInstance().cargarPuntoMapaParaPagina();
        return "misionvision?faces-redirect=true";
    }
    
    public String paginaDirectorioRedir() {
        GestorDirectorio.getInstance().cargarDirectiva();
        return "directorio?faces-redirect=true";
    }
    
    public String resetearEscuela() {
        escuela = new Escuela();
        return "";
    }

    public String paginaEscuelaRedir(Escuela escuela) {
        String subdom = escuela.getDominio();
        String parte = subdom.split("\\.")[0];
        
        return "index?faces-redirect=true&aso=" + parte;
    }

    public String paginaFotosRedir(Galeria galeria) {
        GestorGalerias.getInstance().cargarFotos(galeria);
        GestorGalerias.getInstance().cargarVideos(galeria);
        return "fotos?faces-redirect=true";
    }

    public String paginaGaleriasRedir() {
        GestorGalerias.getInstance().cargarGalerias(GestorPrincipal.getInstance().getEscuela());
        return "galeria?faces-redirect=true";
    }

    public String paginaPrincipalRedir() {
        return "index?faces-redirect=true";
    }

    public String paginaListaNoticiaRedir() {
        listadoArticulo(0);
        return "listArticulo?faces-redirect=true";
    }
    
    public String paginaListaForoRedir() {
        listadoArticulo(1);
        return "listArticulo?faces-redirect=true";
    }
    
    public String paginaContenidoRedir() {
        obtenerCategorias();
        return "contenidoDisponible?faces-redirect=true";
    }
    
    public String mensajesRedir() {
        return "mensajes";
    }

    public String getActualURL() {
        return actualURL;
    }

    public void obtenerEscuela() {
        if (subdominio == null || subdominio.equals("")) {
            escuela = new Escuela();
        } else {
            GenericController<Escuela> controlador = new GenericController<Escuela>();
            Escuela esc = new Escuela();
            List<Escuela> escuelas = controlador.findWhere(esc, "c.dominio like '%" + subdominio + "%'");
            if (escuelas != null && escuelas.size() != 0) {
                escuela = escuelas.get(0);
            }
        }
    }

    public String formattedDate(Date fecha) {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        try {
            if (fecha != null) {
                return format.format(fecha);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String formattedJustDate(Date fecha) {
        SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
        try {
            if (fecha != null) {
                return format.format(fecha);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String headerComentario(Comentario comentario) {
        String header = "";
        if (comentario == null) {
            return "";
        } else {
            return comentario.getUsuario().getNombre() + "   " + this.formattedJustDate(comentario.getFecha());
        }
    }

    public String obtenerURL() {

        Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if (request instanceof HttpServletRequest) {
            return ((HttpServletRequest) request).getRequestURL().toString();
        } else {
            return "";
        }
    }

    public String obtenerExample() {
        actualURL = obtenerURL();
        return "";
    }

    public Escuela getEscuela() {
        return escuela;
    }

    public void setEscuela(Escuela escuela) {
        this.escuela = escuela;
    }

    public List<Publicidad> getPublicidades() {
        publicidades = new ArrayList<Publicidad>();
        GenericController<Publicidad> contPub = new GenericController<Publicidad>();
        /*GenericController<Publicidad> guardador=new GenericController<Publicidad>();
         Publicidad pub=new Publicidad();
         pub.setDescripcion("Esta es la pagina de NetFlix");
         pub.setImagen("http://downdetector.co.uk/i/c/300/d8457/netflix-logo.png");
         pub.setLink("http://www.netflix.com");
         //guardador.create(pub);
         publicidades.add(pub);
        
         Publicidad pub1=new Publicidad();
         pub1.setDescripcion("Esta es la pagina de Ferrari");
         pub1.setImagen("http://www.viciografico.com/wp-content/uploads/2013/08/ferrari-logo-1680x1050.jpg");
         pub1.setLink("http://www.ferrari.com");
         //guardador.create(pub1);
         publicidades.add(pub1);
        
         Publicidad pub2=new Publicidad();
         pub2.setDescripcion("Esta es la pagina de Sony");
         pub2.setImagen("http://criticsight.com/wp-content/uploads/2013/06/sony-logo-criticsight.jpg");
         pub2.setLink("http://www.sony.com");
         //guardador.create(pub2);
         publicidades.add(pub2);*/
        if (escuela == null || escuela.getId() == null) {
            obtenerEscuela();
        }
        publicidades = contPub.findWhere(new Publicidad(), " c.escuela.id='" + escuela.getId() + "'");
        return publicidades;
    }
    
    
    
    public void obtenerCategorias(){
        categorias=new ArrayList<Categoria>();
        GenericController<Categoria> contPub=new GenericController<Categoria>();
        if (escuela==null || escuela.getId()==null){
            obtenerEscuela();
        }
        categorias=contPub.findWhere(new Categoria(), " c.escuela.id='"+escuela.getId()+"'");
        
    }
    
    public void obtenerLibros(Categoria categoria){
        listaLibros=new ArrayList<Libro>();
        GenericController<Libro> contPub=new GenericController<Libro>();
        if (escuela==null || escuela.getId()==null){
            obtenerEscuela();
        }
        listaLibros=contPub.findWhere(new Libro(),"c.categoria.id='"+categoria.getId()+"'" );
    }

    public void setPublicidades(List<Publicidad> publicidades) {

        this.publicidades = publicidades;
    }

    public List<Galeria> getGalerias() {
        return galerias;
    }

    public void setGalerias(List<Galeria> galerias) {
        this.galerias = galerias;
    }

    public List<Foro> getNoticias() {
        noticias = new ArrayList<Foro>();
        /*GenericController<Foro> guardador=new GenericController<Foro>();
         for (int i=0;i<7;i++){
         Foro f1=new Foro();
         f1.setNombre("titulo especial "+String.valueOf(i));
         f1.setFecha(new Date());
         f1.setImagen("http://www.lossimpsonsonline.com.ar/la-casa/la-casa.gif");
         f1.setDescripcion("The requirement here is that we need the "
         + "full URL for a third party javascript utility. The use or architecture of the utility "
         + "doesn't fit well with JSF, but everything short of this call does. The method I found "
         + "will work, but it felt wrong to be digging so deep into the FacesContext. Additionally "
         + "I was hoping there would be a way that could be called with JSF Expression Language since "
         + "this is going to be used in a related way.");
         f1.setTipo(0);
         //guardador.create(f1);
         noticias.add(f1);
         }*/

        return noticias;
    }

    public String acortadorTexto(String texto) {
        if (texto.length() < 101) {
            return texto;
        } else {
            return texto.substring(0, 100) + "...";
        }
    }
    
    public String acortadorTexto200(String texto) {
        if (texto.length() < 201) {
            return texto;
        } else {
            return texto.substring(0, 200) + "...";
        }
    }

    public void setNoticias(List<Foro> noticias) {
        this.noticias = noticias;
    }

    public List<Foro> getForos() {
        return foros;
    }

    public void setForos(List<Foro> foros) {
        this.foros = foros;
    }

    public Foro getForoseleccionado() {
        return foroseleccionado;
    }

    public void setForoseleccionado(Foro foroseleccionado) {
        this.foroseleccionado = foroseleccionado;
    }

    public List<Foro> obtenerNoticiaCorto() {
        listadoArticulo(3);
        return noticiasCorto;
    }
    
    

    public String getImagen(Foro noticia) {
        if (noticia.getImagen().equals("")) {
            return "/resources/images/no-image.png";
        } else {
            return noticia.getImagen();
        }
    }

    public String mostrarForo() {
        Comentario com = new Comentario();
        if (foroseleccionado.getTipo() == 0) {
            setCabeceraArticulo("Noticia");
            return "articulo?faces-redirect=true";
        }
        if (foroseleccionado.getTipo() == 1) {
            setCabeceraArticulo("Foro");
            return "articulo?faces-redirect=true";
        }
        return "";
    }

    public List<Foro> specificForo(int tipo) {
        GenericController<Foro> contForo = new GenericController<Foro>();
        if (escuela == null || escuela.getId() == null) {
            obtenerEscuela();
        }
        List<Foro> forosl = contForo.findWhere(new Foro(), "(c.escuela.id='" + escuela.getId() + "' or c.privacidad='1') and c.estado='0' and c.tipo='" + tipo + "'");//escuela.getForos();
        /*List<Foro> forosAux=new ArrayList<Foro>();
         for(Foro aux:forosl){
         if (aux.getTipo()==tipo){
         forosAux.add(aux);
         }
         }*/
        return forosl;

    }

    public String listadoArticulo(int tipo) {
        List<Foro> forosl = new ArrayList<Foro>();
        if (tipo == 3) {
            forosl = specificForo(0);
        } else {
            forosl = specificForo(tipo);
        }
        Collections.sort(forosl, new CustomComparatorFix());

        if (tipo == 3) {
            noticiasCorto = new ArrayList<Foro>();
            if (forosl.size() > 9) {
                for (int i = 0; i < 9; i++) {
                    noticiasCorto.add(forosl.get(i));
                }
            } else {
                noticiasCorto.addAll(forosl);
            }
            return "";
        }
        else{
            if (tipo==1 || tipo==0){
                foros=new ArrayList<Foro>();
                foros.addAll(forosl);
                if (tipo==0){setCabeceraArticulo("Noticias");}
                if (tipo==1){setCabeceraArticulo("Foros");}
                return "listArticulo?faces-redirect=true";
            }
            if (tipo == 2) {
                eventos = new ArrayList<Foro>();
                eventos.addAll(forosl);
            }
            return "";
        }
    }

    public List<Comentario> getComentarios() {
        return comentarios;
    }

    public void setComentarios(List<Comentario> comentarios) {
        this.comentarios = comentarios;
    }

    public List<Comentario> obtenerComentarios() {
        GenericController<Comentario> controlador = new GenericController<Comentario>();
        if (foroseleccionado != null) {
            comentarios = controlador.findWhere(new Comentario(), "c.foro.id='" + foroseleccionado.getId() + "' and c.estado<>'2' order by c.fecha ASC");
        }
        return comentarios;
    }

    public String nuevoComentario() {
        if (GestorUsuario.getInstance().estaLogeado()) {
            setMostrarComentarioNuevo(true);
        } else {
            setSinLoggin(true);
        }
        return "";
    }

    public String guardarComentario() {
        if (GestorUsuario.getInstance().estaLogeado()) {
            Comentario nuevoCom = new Comentario();
            nuevoCom.setContenido(textoComentario);
            nuevoCom.setFecha(new Date());
            nuevoCom.setForo(foroseleccionado);
            nuevoCom.setUsuario(GestorUsuario.getInstance().getUsuarioActual());
            nuevoCom.setEstado(0);
            GenericController<Comentario> contCom = new GenericController<Comentario>();
            try {
                contCom.create(nuevoCom);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        setMostrarComentarioNuevo(false);
        return "";
    }

    public String denunciarComentario() {
        if (selectedComentario != null) {
            selectedComentario.setEstado(1);
            GenericController<Comentario> contCom = new GenericController<Comentario>();
            try {
                contCom.edit(selectedComentario);
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Comentario Reportado"));
                System.out.println("Reportado existosamente");
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        return "";
    }
    
    public Comentario getSelectedComentario() {
        return selectedComentario;
    }

    public void setSelectedComentario(Comentario selectedComentario) {
        this.selectedComentario = selectedComentario;
    }

    public String getSubdominio() {
        return subdominio;
    }

    public void setSubdominio(String subdominio) {
        this.subdominio = subdominio;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public String getCabeceraArticulo() {
        return cabeceraArticulo;
    }

    public void setCabeceraArticulo(String cabeceraArticulo) {
        this.cabeceraArticulo = cabeceraArticulo;
    }

    public Boolean getMostrarComentarioNuevo() {
        return mostrarComentarioNuevo;
    }

    public void setMostrarComentarioNuevo(Boolean mostrarComentarioNuevo) {
        this.textoComentario = "";
        this.mostrarComentarioNuevo = mostrarComentarioNuevo;
    }

    public Boolean getSinLoggin() {
        return sinLoggin;
    }

    public void setSinLoggin(Boolean sinLoggin) {
        this.sinLoggin = sinLoggin;
    }

    public String getTextoComentario() {
        return textoComentario;
    }

    public void setTextoComentario(String textoComentario) {
        this.textoComentario = textoComentario;
    }

    public List<Foro> getNoticiasCorto() {
        if(noticiasCorto==null)
        {
           listadoArticulo(3);  
        }
        return noticiasCorto;
    }

    public void setNoticiasCorto(List<Foro> noticiasCorto) {
        this.noticiasCorto = noticiasCorto;
    }

    public List<Foro> getEventos() {
        return eventos;
    }

    public void setEventos(List<Foro> eventos) {
        this.eventos = eventos;
    }

    public class CustomComparatorFix implements Comparator<Foro> {

        public int compare(Foro object1, Foro object2) {
            return object2.getFecha().compareTo(object1.getFecha());
        }
    }

    public Integer getDelayMessage() {
        return delayMessage;
    }

    public void setDelayMessage(Integer delayMessage) {
        this.delayMessage = delayMessage;
    }

    public List<Escuela> getEscuelas() {
        return escuelas;
    }

    public void setEscuelas(List<Escuela> escuelas) {
        this.escuelas = escuelas;
    }
    
    public String getLogo()
    {
        if(getEscuela().getImagen()!=null && !getEscuela().getImagen().equals(""))
        {
            return "/resources/imagenesSubidas/logos/"+getEscuela().getImagen();
        }else{
            return "/resources/images/no-image.png";
        }
    }
    public String obtenLogo(Escuela esc)
    {
        if(!esc.getImagen().equals("") && esc.getImagen()!=null)
        {
            return "/resources/imagenesSubidas/logos/"+esc.getImagen();
        }else{
            return "/resources/images/no-image.png";
        }
    }
    
 
    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }

    public List<Libro> getListaLibros() {
        return listaLibros;
    }

    public void setListaLibros(List<Libro> listaLibros) {
        this.listaLibros = listaLibros;
    }

    public Categoria getSelectedCategoria() {
        return selectedCategoria;
    }

    public void setSelectedCategoria(Categoria selectedCategoria) {
        this.selectedCategoria = selectedCategoria;
    }

    public String getNombreCategoria() {
        return nombreCategoria;
    }

    public void setNombreCategoria(String nombreCategoria) {
        this.nombreCategoria = nombreCategoria;
    }
   
}
